home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / stdio / RCS / StdioFileCloseProc.c,v < prev    next >
Text File  |  1991-12-02  |  4KB  |  212 lines

  1. head     1.5;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.5.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.5
  10. date     90.09.11.14.27.18;  author kupfer;  state Exp;
  11. branches 1.5.1.1;
  12. next     1.4;
  13.  
  14. 1.4
  15. date     89.11.04.21.50.19;  author douglis;  state Exp;
  16. branches ;
  17. next     1.3;
  18.  
  19. 1.3
  20. date     89.06.19.14.15.10;  author jhh;  state Exp;
  21. branches ;
  22. next     1.2;
  23.  
  24. 1.2
  25. date     88.07.20.18.11.40;  author ouster;  state Exp;
  26. branches ;
  27. next     1.1;
  28.  
  29. 1.1
  30. date     88.06.10.16.23.29;  author ouster;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34. 1.5.1.1
  35. date     91.12.02.19.53.06;  author kupfer;  state Exp;
  36. branches ;
  37. next     ;
  38.  
  39.  
  40. desc
  41. @@
  42.  
  43.  
  44. 1.5
  45. log
  46. @Use function prototypes. Lint.
  47. @
  48. text
  49. @/* 
  50.  * StdioFileCloseProc.c --
  51.  *
  52.  *    Source code for the "StdioFileCloseProc" library procedure.
  53.  *
  54.  * Copyright 1988 Regents of the University of California
  55.  * Permission to use, copy, modify, and distribute this
  56.  * software and its documentation for any purpose and without
  57.  * fee is hereby granted, provided that the above copyright
  58.  * notice appear in all copies.  The University of California
  59.  * makes no representations about the suitability of this
  60.  * software for any purpose.  It is provided "as is" without
  61.  * express or implied warranty.
  62.  */
  63.  
  64. #ifndef lint
  65. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/StdioFileCloseProc.c,v 1.4 89/11/04 21:50:19 douglis Exp Locker: kupfer $ SPRITE (Berkeley)";
  66. #endif not lint
  67.  
  68. #include "stdio.h"
  69. #include "fileInt.h"
  70. #include <stdlib.h>
  71. #include <errno.h>
  72. #include <unistd.h>
  73.  
  74. /*
  75.  *----------------------------------------------------------------------
  76.  *
  77.  * StdioFileCloseProc --
  78.  *
  79.  *    This procedure is used as the closeProc for all streams
  80.  *    that are associated with files.  It just closes the file
  81.  *    associated with the stream.
  82.  *
  83.  * Results:
  84.  *    Returns 0 if all went well, or EOF if there was an error during
  85.  *    the close operation.
  86.  *
  87.  * Side effects:
  88.  *    A file is closed.
  89.  *
  90.  *----------------------------------------------------------------------
  91.  */
  92.  
  93. int
  94. StdioFileCloseProc(stream)
  95.     register FILE *stream;    /* Stream to be closed.  The clientData
  96.                  * field of the stream contains the id to
  97.                  * use when talking to the operating system
  98.                  * about the stream. */
  99. {
  100.     register FILE *prev;
  101.  
  102.     /*
  103.      * Careful!  Don't free the buffer unless we allocated it.
  104.      */
  105.  
  106.     if ((stream->buffer != stdioTempBuffer)
  107.         && (stream->buffer != stdioStderrBuffer)
  108.         && (stream->buffer != NULL)
  109.         && !(stream->flags & STDIO_NOT_OUR_BUF)) {
  110.     free((char *) stream->buffer);
  111.     stream->buffer = NULL;
  112.     stream->bufSize = 0;
  113.     }
  114.     stream->flags = 0;
  115.     stream->readCount = stream->writeCount = 0;
  116.     if (close((int) stream->clientData) != 0) {
  117.     stream->status = errno;
  118.     return EOF;
  119.     }
  120.  
  121.     /*
  122.      * Free the stream's struct unless it's one of the ones statically
  123.      * allocated for a standard channel.
  124.      */
  125.  
  126.     if ((stream != stdin) && (stream != stdout) && (stream != stderr)) {
  127.     if (stdioFileStreams == stream) {
  128.         stdioFileStreams = stream->nextPtr;
  129.     } else {
  130.         for (prev = stdioFileStreams; prev != NULL;
  131.             prev = prev->nextPtr) {
  132.         if (prev->nextPtr == stream) {
  133.             prev->nextPtr = stream->nextPtr;
  134.             break;
  135.         }
  136.         }
  137.     }
  138.     free((char *) stream);
  139.     }
  140.     return 0;
  141. }
  142. @
  143.  
  144.  
  145. 1.5.1.1
  146. log
  147. @Initial branch for Sprite server.
  148. @
  149. text
  150. @d17 1
  151. a17 1
  152. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/StdioFileCloseProc.c,v 1.5 90/09/11 14:27:18 kupfer Exp $ SPRITE (Berkeley)";
  153. @
  154.  
  155.  
  156. 1.4
  157. log
  158. @fixes for freopen
  159. @
  160. text
  161. @d17 1
  162. a17 1
  163. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/StdioFileCloseProc.c,v 1.3 89/06/19 14:15:10 jhh Exp Locker: douglis $ SPRITE (Berkeley)";
  164. d22 1
  165. d24 1
  166. @
  167.  
  168.  
  169. 1.3
  170. log
  171. @Made stderr buffer static
  172. @
  173. text
  174. @d17 1
  175. a17 1
  176. static char rcsid[] = "$Header: StdioFileCloseProc.c,v 1.2 88/07/20 18:11:40 ouster Exp $ SPRITE (Berkeley)";
  177. d62 1
  178. @
  179.  
  180.  
  181. 1.2
  182. log
  183. @Change file streams so that fdopen can be called more than once
  184. for a given stream id, and get separate buffers.
  185. @
  186. text
  187. @d17 1
  188. a17 1
  189. static char rcsid[] = "$Header: StdioFileCloseProc.c,v 1.1 88/06/10 16:23:29 ouster Exp $ SPRITE (Berkeley)";
  190. d57 1
  191. @
  192.  
  193.  
  194. 1.1
  195. log
  196. @Initial revision
  197. @
  198. text
  199. @d17 1
  200. a17 1
  201. static char rcsid[] = "$Header: atoi.c,v 1.1 88/04/28 17:20:23 ouster Exp $ SPRITE (Berkeley)";
  202. d50 2
  203. d70 2
  204. a71 2
  205.      * Don't free the statically-allocated structures for the standard
  206.      * streams, either.
  207. d75 12
  208. a86 2
  209.         stdioFileStreams[(int) stream->clientData] = NULL;
  210.         free((char *) stream);
  211. @
  212.